home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / oberonv4 / source / system / keycmds.mod (.txt) < prev    next >
Oberon Text  |  1994-06-16  |  6KB  |  135 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. Syntax10b.Scn.Fnt
  4. MODULE KeyCmds;    (* CAS 19-Jun-91 *)    (*sample extensions of EdiTKeys / TBoxKeys / WriteKeys*)
  5.     IMPORT
  6.         Oberon, Display, Fonts, Viewers, MenuViewers, Texts, TextFrames;
  7.     CONST
  8.         cpm = 3;    (*characters per month name*)
  9.         mnam: ARRAY 12*cpm + 1 OF CHAR;
  10.         lastTime: LONGINT;
  11.         W: Texts.Writer;
  12.         B: Texts.Buffer;
  13.     PROCEDURE Ch(ch: CHAR);
  14.     BEGIN Texts.Write(W, ch)
  15.     END Ch;
  16.     PROCEDURE Int(x: LONGINT);
  17.     BEGIN Texts.WriteInt(W, x, 0)
  18.     END Int;
  19.     PROCEDURE Int2(x: LONGINT);
  20.     BEGIN
  21.         IF x > 10 THEN Ch(CHR(x DIV 10 + 30H)) ELSE Ch("0") END;
  22.         Ch(CHR(x MOD 10 + 30H))
  23.     END Int2;
  24.     PROCEDURE Month(m: LONGINT);
  25.         VAR i, j: LONGINT;
  26.     BEGIN j := m * cpm; i := j - cpm; REPEAT Ch(mnam[i]); INC(i) UNTIL i = j
  27.     END Month;
  28.     PROCEDURE InsertAtCaret(buf: Texts.Buffer);
  29.         VAR msg: Oberon.CopyOverMsg;
  30.     BEGIN msg.text := TextFrames.Text(""); msg.beg := 0; msg.end := buf.len;
  31.         Texts.Insert(msg.text, 0, buf); Oberon.FocusViewer.handle(Oberon.FocusViewer, msg)
  32.     END InsertAtCaret;
  33.     PROCEDURE MarkedText(): Texts.Text;
  34.         VAR v: Viewers.Viewer;
  35.     BEGIN v := Oberon.MarkedViewer();
  36.         IF (v IS MenuViewers.Viewer) & (v.dsc.next IS TextFrames.Frame) THEN
  37.             RETURN v.dsc.next(TextFrames.Frame).text
  38.         ELSE RETURN NIL
  39.         END
  40.     END MarkedText;
  41.     PROCEDURE DateStamp*;    (**EdiTKeys, TBoxKeys, and WriteKeys**)
  42.         VAR S: Texts.Scanner; date, time: LONGINT;
  43.     BEGIN Oberon.GetClock(time, date); Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  44.         IF S.class = Texts.Name THEN Texts.SetFont(W, Fonts.This(S.s)) ELSE Texts.SetFont(W, Fonts.Default) END;
  45.         Int(date MOD 20H); Ch(" "); Month( (date DIV 20H) MOD 10H ); Ch(" "); Int2( (date DIV 200H) MOD 100 );
  46.         InsertAtCaret(W.buf)
  47.     END DateStamp;
  48.     PROCEDURE DateStamp1*;    (**EdiTKeys, TBoxKeys, and WriteKeys**)
  49.         VAR S: Texts.Scanner; date, time: LONGINT;
  50.     BEGIN Oberon.GetClock(time, date); Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  51.         IF S.class = Texts.Name THEN Texts.SetFont(W, Fonts.This(S.s)) ELSE Texts.SetFont(W, Fonts.Default) END;
  52.         Int(date MOD 20H); Ch("-"); Month( (date DIV 20H) MOD 10H ); Ch("-"); Int2( (date DIV 200H) MOD 100 );
  53.         InsertAtCaret(W.buf)
  54.     END DateStamp1;
  55.     PROCEDURE ChangeFont*;    (**EdiTKeys, TBoxKeys, and WriteKeys**)
  56.         VAR S: Texts.Scanner; text: Texts.Text;
  57.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  58.         IF S.class = Texts.Name THEN text := MarkedText();
  59.             IF text # NIL THEN Texts.ChangeLooks(text, 0, text.len, {0}, Fonts.This(S.s), 0, 0) END
  60.         END
  61.     END ChangeFont;
  62.     PROCEDURE ChangeColor*;    (**EdiTKeys, TBoxKeys, and WriteKeys**)
  63.         VAR S: Texts.Scanner; text: Texts.Text;
  64.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  65.         IF (S.class = Texts.Int) & (0 <= S.i) & (S.i < 16) THEN text := MarkedText();
  66.             IF text # NIL THEN Texts.ChangeLooks(text, 0, text.len, {1}, NIL, SHORT(SHORT(S.i)), 0) END
  67.         END
  68.     END ChangeColor;
  69.     PROCEDURE ChangeOffset*;    (**EdiTKeys, TBoxKeys, and WriteKeys**)
  70.         VAR S: Texts.Scanner; text: Texts.Text;
  71.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  72.         IF (S.class = Texts.Int) & (-128 <= S.i) & (S.i < 128) THEN text := MarkedText();
  73.             IF text # NIL THEN Texts.ChangeLooks(text, 0, text.len, {2}, NIL, 0, SHORT(SHORT(S.i))) END
  74.         END
  75.     END ChangeOffset;
  76.     PROCEDURE Include*;    (**EdiTKeys, TBoxKeys, and WriteKeys**)
  77.         VAR S: Texts.Scanner; buf: Texts.Buffer; text: Texts.Text; beg, end: LONGINT;
  78.     BEGIN NEW(buf); Texts.OpenBuf(buf); Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  79.         IF S.class = Texts.Name THEN text := TextFrames.Text(S.s); Texts.Scan(S); beg := 0;
  80.             IF S.class = Texts.Int THEN end := S.i; Texts.Scan(S);
  81.                 IF S.class = Texts.Int THEN beg := end; end := S.i END
  82.             ELSE end := text.len
  83.             END;
  84.             IF (0 <= beg) & (beg < end) & (end <= text.len) THEN Texts.Save(text, beg, end, buf); InsertAtCaret(buf) END
  85.         END
  86.     END Include;
  87.     PROCEDURE MarkFocus*;
  88.         VAR v: Viewers.Viewer; x, y: INTEGER;
  89.     BEGIN v := Oberon.FocusViewer; x := v.X + v.W DIV 2; y := v.Y + v.H DIV 2;
  90.         Oberon.DrawCursor(Oberon.Pointer, Oberon.Star, x, y)
  91.     END MarkFocus;
  92.     PROCEDURE Save*;
  93.         VAR text: Texts.Text; beg, end, time: LONGINT;
  94.     BEGIN Oberon.GetSelection(text, beg, end, time);
  95.         IF time >= lastTime THEN Texts.OpenBuf(B); Texts.Save(text, beg, end, B) END
  96.     END Save;
  97.     PROCEDURE Paste*;
  98.         VAR buf: Texts.Buffer;
  99.     BEGIN NEW(buf); Texts.OpenBuf(buf); Texts.Copy(B, buf); InsertAtCaret(buf)
  100.     END Paste;
  101.     PROCEDURE GetRange (VAR text: Texts.Text; VAR org, end: LONGINT);
  102.         VAR s: Texts.Scanner; v: Viewers.Viewer; f: TextFrames.Frame;
  103.     BEGIN text := NIL; org := 0; end := 0;
  104.         Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(s);
  105.         IF s.class # Texts.Int THEN s.i := 1 END;
  106.         IF Oberon.FocusViewer IS MenuViewers.Viewer THEN v := Oberon.FocusViewer(MenuViewers.Viewer);
  107.             IF v.dsc.next IS TextFrames.Frame THEN f := v.dsc.next(TextFrames.Frame);
  108.                 IF f.hasCar THEN text := f.text; end := f.carloc.pos - s.i END
  109.             END
  110.         END
  111.     END GetRange;
  112.     PROCEDURE Bold*;
  113.         VAR r: Texts.Reader; text: Texts.Text; org, beg, end: LONGINT; ch: CHAR; name: ARRAY 32 OF CHAR;
  114.     BEGIN GetRange(text, org, end); beg := end;
  115.         LOOP
  116.             IF beg <= org THEN EXIT END;
  117.             Texts.OpenReader(r, text, beg-1); Texts.Read(r, ch);
  118.             IF ~( (ch = ".") OR ("0" <= ch) & (ch <= "9") OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z") ) THEN EXIT END;
  119.             DEC(beg)
  120.         END;
  121.         IF beg < end THEN
  122.             Texts.OpenReader(r, text, end); Texts.Read(r, ch);
  123.             name := "Syntax10b.Scn.Fnt";
  124.             IF r.fnt # Fonts.This("Syntax10.Scn.Fnt") THEN name := "Syntax12b.Scn.Fnt" END;
  125.             Texts.ChangeLooks(text, beg, end, {0}, Fonts.This(name), 0, 0)
  126.         END
  127.     END Bold;
  128.     PROCEDURE ToBottom*;
  129.         VAR f: TextFrames.Frame;
  130.     BEGIN f := Oberon.FocusViewer.dsc.next(TextFrames.Frame); TextFrames.Show(f, f.text.len)
  131.     END ToBottom;
  132. BEGIN Texts.OpenWriter(W); NEW(B); Texts.OpenBuf(B);
  133.     mnam := "JanFebMarAprMayJunJulAugSepOctNovDec"; lastTime := 0
  134. END KeyCmds.
  135.